stat関数は、ファイルやディレクトリの状態を取得します。
この関数は、C言語のライブラリ関数(標準関数)ではありませんので、コンパイラにより、使えない場合があります。
#include <sys/stat.h>
int stat(const char *path, struct stat *buf);
*pathは状態を取得するファイルやディレクトリのパス名を指定します。
*bufは取得した状態を格納するstat構造体を指定します。
戻り値として、処理が成功した場合は0が、エラーの場合は-1を返します。
stat構造体は、次のメンバにより構成されています。
メンバ名 | 内容 |
---|---|
st_dev | ファイルがあるデバイスを示すID(デバイスID)です。 |
st_ino | inode番号です。 |
st_mode | ファイルの種類とアクセス保護モード(パーミッション)です。 |
st_nlink | ハードリンクの数です。(ディレクトリの場合、最低でも2です。) |
st_uid | 所有者のユーザIDです。 |
st_gid | 所有者のグループIDです。 |
st_rdev | 特殊ファイル(デバイスファイル)の場合のデバイスIDです。通常ファイルやディレクトリの場合は0です。 |
st_size | バイト単位の容量です。 |
st_blksize | ファイルシステムが最も効率的に入出力が出来る「好ましい」ブロックサイズです。 |
st_blocks | 割り当てられているブロック数です。 |
st_atime | 最終アクセス時刻です。 |
st_mtime | 最終修正時刻です。 |
st_ctime | 最終状態変更時刻です。(inode情報の更新も含みます。) |
また、上記st_modeメンバ用に、次のマクロとフラグが用意されています。
マクロ名 | 機能 |
---|---|
S_ISREG(m) | 通常のファイルかをチェックします。 |
S_ISDIR(m) | ディレクトリかをチェックします。 |
S_ISCHR(m) | キャラクター・デバイスかをチェックします。 |
S_ISBLK(m) | ブロック・デバイスかをチェックします。 |
S_ISFIFO(m) | FIFO(名前付きパイプ)かをチェックします。 |
フラグ名 | 内容 |
---|---|
S_ISUID | 0004000:セット・ユーザーID(set user ID)です。 |
S_ISGID | 0002000:セット・グループID(set group ID)です。 |
S_IRWXU | 00700:ファイル所有者(owner)のアクセス許可用のビットマスクです。 |
S_IRUSR | 00400:所有者の読み込み許可です。 |
S_IWUSR | 00200:所有者の書き込み許可です。 |
S_IXUSR | 00100:所有者の実行許可です。 |
S_IRWXG | 00070:グループ(group)のアクセス許可用のビットマスクです。 |
S_IRGRP | 00040:グループの読み込み許可です。 |
S_IWGRP | 00020:グループの書き込み許可です。 |
S_IXGRP | 00010:グループの実行許可です。 |
S_IRWXO | 00007:他人(others)のアクセス許可用のビットマスクです。 |
S_IROTH | 00004:他人の読み込み許可です。 |
S_IWOTH | 00002:他人の書き込み許可です。 |
S_IXOTH | 00001:他人の実行許可です。 |
プログラム 例
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <sys/stat.h> int main(int argc, char **argv) { struct stat stat_buf; if (argc != 2) { fprintf(stderr, 'main : 実行時引数の数が不当です\n'); exit(EXIT_FAILURE); } if (stat(*(argv + 1), &stat_buf) == 0) { /* ファイル情報を表示 */ printf('デバイスID : %d\n',stat_buf.st_dev); printf('inode番号 : %d\n',stat_buf.st_ino); printf('アクセス保護 : %o\n',stat_buf.st_mode); printf('ハードリンクの数 : %d\n',stat_buf.st_nlink); printf('所有者のユーザID : %d\n',stat_buf.st_uid); printf('所有者のグループID : %d\n',stat_buf.st_gid); printf('デバイスID(特殊ファイルの場合) : %d\n',stat_buf.st_rdev); printf('容量(バイト単位) : %d\n',stat_buf.st_size); printf('ファイルシステムのブロックサイズ : %d\n',stat_buf.st_blksize); printf('割り当てられたブロック数 : %d\n',stat_buf.st_blocks); printf('最終アクセス時刻 : %s',ctime(&stat_buf.st_atime)); printf('最終修正時刻 : %s',ctime(&stat_buf.st_mtime)); printf('最終状態変更時刻 : %s',ctime(&stat_buf.st_ctime)); } else { perror('main '); } return EXIT_SUCCESS; }
例の実行結果
$ ls -li stat.c 3211317 -rw-r--r-- 1 user users 1315 2008-08-11 15:53 stat.c $ ./stat.exe stat.c デバイスID : 2055 inode番号 : 3211317 アクセス保護 : 100644 ハードリンクの数 : 1 所有者のユーザID : 1001 所有者のグループID : 100 デバイスID(特殊ファイルの場合) : 0 容量(バイト単位) : 1315 ファイルシステムのブロックサイズ : 4096 割り当てられたブロック数 : 8 最終アクセス時刻 : Wed Feb 13 11:13:00 2008 最終修正時刻 : Mon Aug 11 15:53:30 2008 最終状態変更時刻 : Mon Aug 11 15:53:30 2008 $ $ ls -ldi DIR1 3473455 drwxr-xr-x 2 user users 4096 2008-07-31 18:28 DIR1 $ ./stat.exe DIR1 デバイスID : 2055 inode番号 : 3473455 アクセス保護 : 40755 ハードリンクの数 : 2 所有者のユーザID : 1001 所有者のグループID : 100 デバイスID(特殊ファイルの場合) : 0 容量(バイト単位) : 4096 ファイルシステムのブロックサイズ : 4096 割り当てられたブロック数 : 8 最終アクセス時刻 : Tue Jul 29 10:11:23 2008 最終修正時刻 : Thu Jul 31 18:28:21 2008 最終状態変更時刻 : Thu Jul 31 18:28:21 2008 $